from abc import ABC, abstractmethod

# 1. 运行代码
# 输出如下：
# 普通用户 101 借阅了图书 B1001，最长借阅时间为 14 天。
# VIP用户 201 借阅了图书 B2002，最长借阅时间为 30 天。

# 2. 指出该代码体现了哪个原则
# 体现了开闭原则（Open/Closed Principle, OCP）

# 3. 请说明该代码是如何体现该原则
# 开闭原则指出，软件实体（类、模块、函数等）应该对扩展开放，对修改关闭。也就是说，当需求变化时，可以通过增加新的代码来扩展功能，而不是修改现有的代码。
# 在这个例子中：
# - `BorrowStrategy` 是一个抽象的借书策略类，定义了借书的接口。
# - `RegularUserBorrowStrategy` 和 `VIPUserBorrowStrategy` 是具体的借书策略实现，分别适用于普通用户和VIP用户。
# - `LibraryManagementSystem` 类依赖于 `BorrowStrategy` 抽象类，而不是具体的策略实现。
# - 当需要增加新的借书策略时（例如，学生用户的借书策略），只需新增一个具体的策略类并传递给 `LibraryManagementSystem`，而无需修改现有代码。
# - 这种设计使得系统更加灵活，易于扩展，同时保持了现有代码的稳定性。

# 抽象的借书策略类
class BorrowStrategy(ABC):
    @abstractmethod
    def borrow(self, user_id, book_id):
        pass

# 普通用户的借书策略
class RegularUserBorrowStrategy(BorrowStrategy):
    def borrow(self, user_id, book_id):
        print(f"普通用户 {user_id} 借阅了图书 {book_id}，最长借阅时间为 14 天。")

# VIP用户的借书策略
class VIPUserBorrowStrategy(BorrowStrategy):
    def borrow(self, user_id, book_id):
        print(f"VIP用户 {user_id} 借阅了图书 {book_id}，最长借阅时间为 30 天。")

# 借书功能类，它依赖于抽象的策略类
class LibraryManagementSystem:
    def __init__(self, borrow_strategy: BorrowStrategy):
        self.borrow_strategy = borrow_strategy

    def borrow_book(self, user_id, book_id):
        self.borrow_strategy.borrow(user_id, book_id)

# 测试示例
if __name__ == "__main__":
    # 普通用户借书
    regular_borrow_strategy = RegularUserBorrowStrategy()
    library_system = LibraryManagementSystem(regular_borrow_strategy)
    library_system.borrow_book(user_id=101, book_id="B1001")

    # VIP用户借书
    vip_borrow_strategy = VIPUserBorrowStrategy()
    library_system = LibraryManagementSystem(vip_borrow_strategy)
    library_system.borrow_book(user_id=201, book_id="B2002")